﻿using System.ComponentModel;
using System.Runtime.InteropServices;

namespace WindowsAPI.PE
{
    /// <summary>DOS .EXE заголовок</summary>
    /// <!-- IMAGE_DOS_HEADER -->
    //[Description("http://education.kulichki.net/comp/hack/27.htm")]
    [Description("http://code.cheesydesign.com/?p=572")]
    [StructLayout(LayoutKind.Sequential)]
    public struct IMAGE_DOS_HEADER
    {
        public const ushort IMAGE_DOS_SIGNATURE = 0x5A4D;

        /// <summary>Магическое число</summary>
        public readonly ushort Magic;
        /// <summary>Количество байт на последней странице файла</summary>
        public readonly ushort cblp;
        /// <summary>Количество страниц в файле</summary>
        public readonly ushort cp;
        /// <summary>Relocations</summary>
        public readonly ushort crlc;
        /// <summary>Размер заголовка в параграфах</summary>
        public readonly ushort cparhdr;
        /// <summary>Minimum extra paragraphs needed</summary>
        public readonly ushort MinAlloc;
        /// <summary>Maximum extra paragraphs needed</summary>
        public readonly ushort MaxAlloc;
        /// <summary>Начальное ( относительное ) значение регистра SS</summary>
        public readonly ushort ss;
        /// <summary>Начальное значение регистра SP</summary>
        public readonly ushort sp;
        /// <summary>Контрольная сумма</summary>
        public readonly ushort cSum;
        /// <summary>Начальное значение регистра IP</summary>
        public readonly ushort ip;
        /// <summary>Начальное ( относительное ) значение регистра CS</summary>
        public readonly ushort cs;
        /// <summary>Адрес в файле на таблицу переадресации</summary>
        public readonly ushort lfarlc;
        /// <summary>Количество оверлеев</summary>
        public readonly ushort ovno;
        /// <summary>Зарезервировано [4]</summary>
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
        //public fixed ushort res[4];
        public readonly ushort[] Res;
        /// <summary>OEM identifier (for e_oeminfo)</summary>
        public readonly ushort OEMId;
        /// <summary>OEM information; e_oemid specific</summary>
        public readonly ushort OEMInfo;
        /// <summary>Зарезервировано [10]</summary>
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
        //public fixed ushort res2[10];
        public readonly ushort[] Res2;
        /// <summary>Адрес в файле нового .exe заголовка</summary>
        public readonly ushort lfanew;
    }
}
